﻿using Furion;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using ZeroAdmin.Core;

namespace ZeroAdmin.Web.Core;

/// <summary>
/// 启动 AppStartup的数值越大，优先级越高。
/// </summary>
[AppStartup(0)]
public class Startup : AppStartup
{
    /// <summary>
    /// 配置服务
    /// </summary>
    /// <param name="services"></param>    
    public void ConfigureServices(IServiceCollection services)
    {
        // 添加Jwt全局授权
        services.AddJwt<JwtHandler>(enableGlobalAuthorize: true);
        // 配置跨域
        services.AddCorsAccessor();

        // 将控制器的服务添加到指定的Microsoft.Extensions.DependencyInjection.IServiceCollection中。此方法不会注册用于视图或页面的服务。
        services.AddControllers().AddNewtonsoftJson(options =>
        {
            // 首字母小写(驼峰样式)
            options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            // 时间格式化
            options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
            // 忽略循环引用
            options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            // 忽略空值
            options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
        }).AddInjectWithUnifyResult();

        services.SqlSugarScopeConfigure();
    }

    /// <summary>
    /// 配置
    /// </summary>
    /// <param name="app"></param>
    /// <param name="env"></param>
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // 检查当前主机环境名称是否为Microsoft.Extensions.Hosting.Environments.Development。
        if (env.IsDevelopment())
        {
            // 捕获同步和异步系统。从管道中获取异常实例，并生成HTML错误响应。
            app.UseDeveloperExceptionPage();
        }

        // 添加中间件，用于将HTTP请求重定向到HTTPS。
        app.UseHttpsRedirection();

        // 添加一个Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware中间件到指定的Microsoft.AspNetCore.Builder.IApplicationBuilder。
        app.UseRouting();

        // 添加跨域中间件
        app.UseCorsAccessor();

        // 将Microsoft.AspNetCore.Authentication.AuthenticationMiddleware添加到指定的Microsoft.AspNetCore.Builder中。
        // IApplicationBuilder，它启用身份验证功能。
        app.UseAuthentication();

        // 使用授权 必须在app.UseRouting()和app.UseEndpoints(…)的调用中间使用才使中间件正常
        app.UseAuthorization();

        // 注入基础中间件
        app.UseInject(string.Empty);

        // 使用从配置的Microsoft.AspNetCore.Routing.IEndpointRouteBuilder构建的Microsoft.AspNetCore.Routing.EndpointDataSource实例，
        // 向指定的Microsoft.AspNetCore.Builder.IApplicationBuilder添加一个Microsoft.AspNetCore.Routing.EndpointMiddleware中间件。
        // endpointmiddleware将执行与当前请求相关联的Microsoft.AspNetCore.Http.Endpoint。
        app.UseEndpoints(endpoints =>
        {
            // 将控制器动作的端点添加到Microsoft.AspNetCore.Routing.IEndpointRouteBuilder中，而不指定任何路由。
            endpoints.MapControllers();
        });
    }
}
